package com.etalk.crm.dao;

import com.etalk.crm.pojo.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.time.LocalTime;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 *
 * @author Jordan
 */
@Mapper
public interface LessonsMapper {

	/**
	 * 查询学员课程列表
	 * @param personId 学员id
	 * @param classState 课程状态
	 * @param classStartTime 课程时间开始时间
	 * @param classEndTime 课程时间结束时间
	 * @return
	 */
	List<LessonResult> selectLessonPageByPersonId(@Param("personId") int personId,@Param("classState") Integer classState, @Param("classStartTime")Date classStartTime, @Param("classEndTime")Date classEndTime);

	/**
	 * 查询所有课程记录
	 * @param record 查询条件
	 * @return
	 */
	List<LessonResult> selectLessonPage(LessonResult record);
	/**
	 * 查询后台取消课程原因
	 * @return
	 */
	List<CancelCourseRecord> selectCancelReasonList();

	/**
	 * 查询调整课程需要的信息
	 * @param lessonId 课程id
	 * @return 课程信息
	 */
	LessonResult selectChangeLessonInfoByLessonId(@Param("lessonId") int lessonId);

	/**
	 * 查询自动调课需要的课程信息
	 * @param lessonId 课程id
	 * @return
	 */
	LessonResult selectChangeAutoLessonInfoByLessonId(@Param("lessonId") int lessonId);

	/**
	 * 查询课程信息
	 * @param listLessonId 课程id数组
	 * @return
	 */
	List<LessonResult> selectChangeAutoLessonInfo(@Param("list") List<Integer> listLessonId);

	/**
	 * 查询老师基地
	 * @return
	 */
	List<Map<String,Object>> selectTeacherSiteList();

	/**
	 * 查询老师级别
	 * @return
	 */
	List<Map<String,Object>> selectTeacherLevelList();

	/**
	 * 查询上课方式列表
	 * @return
	 */
	List<Map<String,Object>> selectClassWayList();

	/**
	 * 查询调课更换老师原因
	 * @return
	 */
	List<Map<String,Object>> selectLessonChangeReasonList();
	/**
	 * 查询公告界面排除老师中可选老师数据
	 * @param record 条件
	 * @return 老师列表
	 */
	List<String> selectTeacherListByMsgSend(Lessons record);

	/**
	 * 查询需要发送消息公告的所有学生
	 * @param record 条件
	 * @return
	 */
	List<Person> selectStudentListByMsgSend(Lessons record);

	/**
	 * 查询需要取消的课程列表
	 * @param record 条件
	 * @return 课程id列表
	 */
	List<Integer> selectLessonIdListByMsgSend(Lessons record);

	/**
	 * 取消接收消息的人的课程
	 * @param record 条件
	 * @return 记录数
	 */
	int updateStateByMsgSend(Lessons record);

	/**
	 * 查询取消课程的用户信息
	 * @param record 条件
	 * @return 用户列表
	 */
	List<Person> selectTokenInfoByMsgSend(Lessons record);

	/**
	 * 取消接收消息的人的课程
	 * @param record 条件
	 * @return 记录数
	 */
	int updateLearnedClassByMsgSend(Lessons record);

	/**
	 * 关闭老师班表
	 * @param record 条件
	 * @return 删除记录数
	 */
	int deleteLessonByMsgSend(Lessons record);

	/**
	 * 查询需要发送的微信设备唯一id
	 * @param record 条件
	 * @return 设备id
	 */
	List<String> selectWXOpenIdListByMsgSend(Lessons record);

	/**
	 * 查询需要发送的APP设备唯一id
	 * @param record 条件
	 * @return 设备id
	 */
	List<String> selectAppDeviceIdListByMsgSend(Lessons record);

	/**
	 * 查询学员信息卡已预约课程列表
	 * @param personId 学员id
	 * @return 结果
	 */
	List<StudentLesson> selectStudentBookedLessonListByPersonId(@Param("personId") Integer personId);

	/**
	 * 查询学员信息卡已完成课程列表
	 * @param personId 学员id
	 * @return 结果
	 */
	List<StudentLesson> selectStudentCompletedLessonListByPersonId(@Param("personId") Integer personId);


	/**
	 * @Author James
	 * @Description -根据id  查询 某节课相关信息
	 * @Date 18:23 2019/1/11
	 * @Param
	 * @return
	 **/
	Lessons selectEvaluationReply(@Param("lessonId") int lessonId);

	/**
	 * 查询订单是否有未上的课程
	 * @param orderId 订单id
	 * @return 记录数
	 */
	int selectClassCountByOrderId(@Param("orderId")String orderId);

	/**
	 * 查询老师指定时间课表是否有空闲
	 * @param teacherLogin 老师登录名
	 * @param listWeek 查询的周
	 * @param listTime 查询的时间
	 * @return
	 */
	List<Map<String,String>> selectFreeScheduleListByPersonId(@Param("teacherLogin") String teacherLogin,@Param("listWeek") List<Integer> listWeek,@Param("listTime") List<LocalTime> listTime);

	/**
	 * 查询老师下周的班表时间已被设置常用老师数
	 * @param teacherId 老师id
	 * @param startDate 开始日期
	 * @param endDate 节数日期
	 * @return
	 */
	List<TeacherClassSchedule> selectTeacherClassTimeByPersonId(@Param("teacherId") int teacherId, @Param("startDate")LocalDate startDate,@Param("endDate")LocalDate endDate);

	/**
	 * 查询老师下周的班表时间最大最小值
	 * @param teacherId 老师id
	 * @param startDate 开始日期
	 * @param endDate 节数日期
	 * @return
	 */
	Map<String,String> selectTeacherMaxMinClassTimeByPersonId(@Param("teacherId") int teacherId, @Param("startDate")LocalDate startDate,@Param("endDate")LocalDate endDate);
	/**
	 * 标记课程为返还课时和取消课时
	 * @param lessonId
	 * @return
	 */
	/**
	 * 标记课程为返还课时和取消课时
	 * @param lessonId 课程id
	 * @param state 课程状态
	 * @return 记录数
	 */
	int updateLessonReturnByLessonId(@Param("lessonId")int lessonId,@Param("state")int state);

	/**
	 * 查询返还课时的课程信息
	 * @param lessonId 课程id
	 * @return 结果
	 */
	LessonResult selectLessonReturnInfoByLessonId(@Param("lessonId")int lessonId);

	/**
	 * 添加返还课时原因
	 *
	 * @param returnRason
	 * @return
	 */
	/**
	 * 添加返还课时原因
	 * @param returnReason 返还课时原因
	 * @return 记录数
	 */
	int insertReturnReason(Map<String,Object> returnReason);

	/**
	 * 根据返还课时原因id查询原因名称
	 * @param returnReasonIds 原因id
	 * @return 原因名称
	 */
	String selectReturnReasonListByIds(@Param("returnReasonIds") List<Integer> returnReasonIds);

	/**
	 * 查询返还课时原因
	 * @return 记录
	 */
	List<Map<String,Object>> selectReturnReasonList();

	/**
	 * 查询学员课程评论数据
	 * @param record 查询条件
	 * @return 分页数据
	 */
	List<StudentEvaluationResult> selectStudentEvaluationByPage(StudentEvaluationResult record);

	/**
	 * 修改官网首页是否显示本节课学员评价
	 * @param lessonId 课程id
	 * @param show 是否显示标记
	 * @return
	 */
	int updateLessonShow(@Param("lessonId")int lessonId,@Param("show")int show);

	/**
	 * 添加老师投诉学员的处理结果
	 * @param lessonId 课程id
	 * @param result 处理结果
	 * @param handler 处理人
	 * @return
	 */
	int updateTeaComplaintByLessonId(@Param("lessonId")int lessonId,@Param("result")String result,@Param("handler")String handler);

	/**
	 * 查询老师空闲时间表
	 * @param teacherLevel 老师级别id
	 * @param strDate 查询日期
	 * @param groupId 老师组id
	 * @param teacherName 老师账号
	 * @return
	 */
	List<LessonResult> selectFreeClassTimeByDate(@Param("teacherLevel")Integer teacherLevel,@Param("strDate")String strDate,@Param("groupId")Integer groupId,@Param("teacherName") String teacherName);

	/**
	 * 查询某老师的课表
	 * @param teacherId
	 * @return
	 */
	List<TeacherScheduleResult> selectTeacherScheduleList(@Param("teacherId") Integer teacherId);

	/**
	 * 查询课程评价记录
	 * @param lessonId 课程id
	 * @return
	 */
	LessonComments selectLessonCommentByLessonId(@Param("lessonId")int lessonId);

	/**
	 * 查询学员课堂表现
	 * @param lessonId 课程id
	 * @return
	 */
	List<LessonJoinClassPerformance> selectClassPerformancesByLessonId(@Param("lessonId") Integer lessonId);

	/**
	 * 查询错词本记录
	 * @param lessonId 课程id
	 * @return
	 */
	List<LessonKnowledgeMistakesCase> selectLessonMistakesByLessonId(@Param("lessonId") Integer lessonId);

	/**
	 * 查询知识点
	 * @param lessonId 课程id
	 * @param language 语言版本
	 * @return 知识点
	 */
	List<TextbookKnowledgePoint> selectLessonKnowledgePointList(@Param("lessonId")Integer lessonId,@Param("language")String language);

	/**
	 * 老师投诉学员标签
	 * @param lessonId 课程id
	 * @return
	 */
	List<String> selectAttitudeTags(@Param("lessonId") Integer lessonId);

	/**
	 * 获取demo评价选项名称
	 * @param lessonId 课程id
	 * @param language 语言版本
	 * @return demo评价
	 */
	List<Map<String,String>> selectSelectedNameList(@Param("lessonId") Integer lessonId,@Param("language") String language);

	/**
	 * 查询错词本记录
	 * @param lessonId 课程id
	 * @param errorType 错词类型
	 * @return
	 */
	List<MistakeWordResultMapResultMap> selectMistakeWordInfoByLessonId(@Param("lessonId") Integer lessonId,@Param("errorType") String errorType);

	/**
	 * 查询学员某个时间点是否已预约课程
	 * @param personId 学员id
	 * @param classTime 课程时间
	 * @return
	 */
	int countLessonByPersonId(@Param("personId")Integer personId,@Param("classTime") String classTime);
}
